package org.wu.framework.lazy.orm.core.source.advanced;

import org.wu.framework.core.stereotype.LayerField;
import org.wu.framework.lazy.orm.core.persistence.conf.*;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;

/**
 * 表结构适配者
 *
 * @see SourceAdvanced
 */
public interface SourceTableStructureAdvanced {


    /**
     * 根据class解析出表名称 支持自定义忽略前缀、后缀
     *
     * @param clazz 需要解析的class
     * @return 返回表名称
     * @see LazyDatabaseJsonMessage#ddlIgnoredTablePrefix
     * @see LazyDatabaseJsonMessage#ddlIgnoredTableSuffix
     */
    String analyzeLazyTableName(Class<?> clazz);


    /**
     * 根据字段解析出对应的表结构
     *
     * @param lazyTableInfo  表信息
     * @param lazyColumnList 字段集合
     * @return 表结构
     */
    LazyTableEndpoint<?> analyzeLazyTableFromLazyColumns(LazyTableInfo lazyTableInfo, List<? extends LazyColumn> lazyColumnList);

    /**
     * 通过class 解析出对应的表结构
     *
     * @param clazz 需要解析的class
     * @return 表结构
     */
    LazyTableEndpoint<?> analyzeLazyTableFromClass(Class<?> clazz);

    /**
     * 通过bean  解析出对应的表结构
     *
     * @param schemaName 数据库
     * @param tableName  表名称
     * @param beanData   需要解析的数据
     * @return 表结构
     */
    LazyTableEndpoint<?> analyzeLazyTableFromMap(String schemaName, String tableName, Map<String, Object> beanData);

    /**
     * 获取 表字段信息实例
     * @return 表字段信息实例
     */
    LazyTableFieldEndpoint  getLazyTableFieldEndpointInstance();

    /**
     * 获取数据库表实例
     *
     * @return 数据库表实例
     */
    LazyTableEndpoint<?> getLazyTableEndpointInstance();
    /**
     * 当前数据类型缓存的表结构
     *
     * @return 当前数据类型缓存的表结构
     */
    ConcurrentMap<Class<?>, LazyTableEndpoint<?>> getClassTableCache();
    /**
     * 当前数据类型缓存的表结构
     *
     * @return 当前数据类型缓存的表结构
     */
    ConcurrentMap<String, LazyTableEndpoint<?>> getMapTableCache();

    /**
     * 解析 class 表结构中的字段
     *
     * @param clazz              需要解析的class
     * @param tableFileIndexType 过滤字段索引类型
     * @param <T>                范型
     * @return 返回表结构中字段
     */
    <T> List<? extends LazyTableFieldEndpoint> analyzeFieldOnAnnotation(Class<T> clazz, LayerField.LayerFieldType tableFileIndexType);

    /**
     * 关键字转译
     *
     * @param column 数据库字段 <p>user_id</p>
     * @return 转译后数据
     */
    String cleanSpecialColumn(String column);

    /**
     * 获取数据库schema
     *
     * @return 数据库schema
     */
    String findSchemaListSql();

    /**
     * 查询原始表字段sql
     *
     * @param schema 数据库
     * @param table  表
     * @return 原始表字段sql
     */

    String findTableColumnListSql(String schema, String table);

    /**
     * 查询索引sql
     *
     * @param schema 数据库
     * @param table  表
     * @return 查询索引sql
     */
    String findTableColumnIndexListSql(String schema, String table);


    /**
     * 查询表信息 sql
     *
     * @param schema 数据库
     * @param table  表
     * @return 查询表信息sql
     */
    String findTableInfoSql(String schema, String table);


    /**
     * 获取使用的表结构对应的class
     *
     * @return class
     */
    Class<? extends LazyTableInfo> findTableInfoClass();
    /**
     * 获取使用的数据库结构对应的class
     *
     * @return class
     */
    Class<? extends LazySchemata> findSchemaInfoClass();

    /**
     * 获取使用的字段结构对应的class
     *
     * @return class
     */
    Class<? extends LazyColumn> findColumnInfoClass();

    /**
     * 获取字段索引对应的class结构
     *
     * @return class
     */
    Class<? extends LazyColumnIndex> findColumnIndexInfoClass();

}

